package com.example.qxfw.backgroundManagement.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.example.qxfw.backgroundManagement.easyExcel.entity.StationExcel;
import com.example.qxfw.common.SysResult;
import com.example.qxfw.qxzs.mapper.SpecialSrvStationMapper;
import com.example.qxfw.rcyw.mapper.SmallScaleStationMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

/**
 * @author: xwx
 * @description: 用来实现excel的表格
 * @date: 2024/4/30
 * @version: 1.0
 */
@Api(tags = "excel文件上传下载")
@RestController
@RequestMapping("/excel")
@Slf4j
public class ExcelFileController {
    @Autowired
    private SmallScaleStationMapper smallScaleStationMapper;
    //服务站的持久层导入
    @Autowired
    private SpecialSrvStationMapper specialSrvStationMapper;
    @Value("${filePath.excelPath}")
    private String realPath;
    @ApiOperation("自动站的导出")
    @PostMapping("/ExportExcel")
    public SysResult ExportExcel() throws IOException {
        // 设置文件导出的路径
        //String realPath = "D://wsfile/";
//        File folder = new File(realPath);
//        if (!folder.isDirectory()) {
//            folder.mkdirs();
//        }
        String fileName = "StationExcel" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为用户表 然后文件流会自动关闭
        EasyExcel.write(fileName, StationExcel.class).sheet("用户表").doWrite(smallScaleStationMapper.selectList(null));
        // 将文件转换为字节数组
        Path filePath = new File(fileName).toPath();
        byte[] fileData = Files.readAllBytes(filePath);
        // 删除临时文件，如果不需要保留
        Files.delete(filePath);
        // 使用Base64编码字节数组，以便前端可以处理
        String base64FileData = Base64.getEncoder().encodeToString(fileData);
        return SysResult.success("导出成功",base64FileData);
    }

    @ApiOperation("自动站的导入")
    @PostMapping("/ImportExcel")
    public SysResult ImportExcel(MultipartFile multipartFile) throws IOException {
        if ((multipartFile.getOriginalFilename().endsWith(".xls") || multipartFile.getOriginalFilename().endsWith(".xlsx")) && !multipartFile.isEmpty()) {
            // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
            // 这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行
            EasyExcel.read(multipartFile.getInputStream(), StationExcel.class, new PageReadListener<StationExcel>(dataList -> {
                for (StationExcel user : dataList) {
                    //将导入的数据用mybatisPlus一个个添加进数据库
                    if (smallScaleStationMapper.insert(user)) {
                        log.debug("成功导入数据:{}", user.toString());
                    }
                }
            })).sheet().doRead();

            return SysResult.success("导入成功");
        }
        return SysResult.fail("上传的文件为空或格式不正确");
    }
    @ApiOperation("服务站的导出")
    @GetMapping("/ExportExcelFwStation")
    public SysResult ExportExcelFwStation() {
        // 设置文件导出的路径
        //String realPath = "D://wsfile/";
        File folder = new File(realPath);
        if (!folder.isDirectory()) {
            folder.mkdirs();
        }
        String fileName = realPath + "StationExcel" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为用户表 然后文件流会自动关闭
        EasyExcel.write(fileName, StationExcel.class).sheet("用户表").doWrite(specialSrvStationMapper.selectList(null));
        return SysResult.success("导出成功");
    }
}
